﻿// 添加“运行”按钮和“收藏”按钮
function addButtons() {
    // 获取所有的代码块容器
    const codeContainers = document.querySelectorAll('.tongyi-design-highlighter');

    // 遍历每个代码块容器
    codeContainers.forEach((container, index) => {
        // 检查是否已经添加了按钮
        if (!container.querySelector('.custom-run-button')) {
            // 找到语言标签
            const langSpan = container.querySelector('.tongyi-design-highlighter-lang');
            if (langSpan) {
                // 创建容器 div 来包含按钮
                const buttonContainer = document.createElement('div');
                buttonContainer.style.display = 'flex';
                buttonContainer.style.alignItems = 'center';
                buttonContainer.style.marginTop = '1px';
                buttonContainer.className = 'custom-button-container'; // 添加类名以便识别

                // 创建“运行”按钮
                const runButton = document.createElement('div');
                runButton.innerHTML = '<span>▶️运行</span>';
                runButton.style.cursor = 'pointer';
                runButton.style.marginRight = '10px';
                runButton.style.color = '#756FE9';
                runButton.style.fontWeight = 'bold';
                runButton.className = 'custom-run-button'; // 添加类名以便识别

                // 创建“收藏”按钮
                const favoriteButton = document.createElement('div');
                favoriteButton.innerHTML = '<span>❤️收藏</span>';
                favoriteButton.style.cursor = 'pointer';
                favoriteButton.style.marginRight = '10px';
                favoriteButton.style.color = '#756FE9';
                favoriteButton.style.fontWeight = 'bold';
                favoriteButton.className = 'custom-favorite-button'; // 添加类名以便识别

                // 将按钮添加到容器中
                buttonContainer.appendChild(runButton);
                buttonContainer.appendChild(favoriteButton);

                // 将按钮容器插入到 langSpan 的后面
                langSpan.parentNode.insertBefore(buttonContainer, langSpan.nextSibling);

                // 添加“运行”按钮点击事件
                runButton.addEventListener('click', function () {
                    const codeBlock = container.querySelector('pre code');
                    if (codeBlock) {
                        const codeText = codeBlock.innerText;

                        // 正则检查是否是 VBA 代码
                        if (/^\s*Sub\b[\s\S]*End Sub\s*$/.test(codeText)) {
                            const encodedCode = encodeURIComponent(codeText);

                            // 将 VBA 代码发送给 C# 后端
                            if (window.chrome && window.chrome.webview) {
                                window.chrome.webview.postMessage({
                                    type: 'runVBA',
                                    code: encodedCode
                                });
                            } else {
                                console.error('未找到 C# 后端通信接口！');
                            }
                        } else {
                            alert('提取的代码不是有效的 VBA 代码！');
                        }
                    } else {
                        alert('未找到代码块！');
                    }
                });

                // 添加“收藏”按钮点击事件
                favoriteButton.addEventListener('click', function () {
                    const codeBlock = container.querySelector('pre code');
                    if (codeBlock) {
                        const codeText = codeBlock.innerText;

                        // 发送消息到 C# 后端
                        if (window.chrome && window.chrome.webview) {
                            window.chrome.webview.postMessage({
                                type: 'favoriteCode',
                                code: codeText
                            });
                        } else {
                            console.error('未找到 C# 后端通信接口！');
                        }
                    } else {
                        alert('未找到代码块！');
                    }
                });
            }
        }
    });
}

// 添加“导出”按钮
function addExportButton() {
    // 获取所有的 Markdown 容器
    const markdownContainers = document.querySelectorAll('.tongyi-markdown');

    // 遍历每个 Markdown 容器
    markdownContainers.forEach((container) => {
        // 检查是否已经添加了导出按钮
        if (!container.querySelector('.custom-export-button')) {
            // 找到目标位置（在最后一个子元素前面）
            const lastChild = container.lastElementChild;

            if (lastChild) {
                // 创建“导出”按钮
                const exportButton = document.createElement('button');
                exportButton.textContent = '📥导出';
                exportButton.style.marginTop = '10px';
                exportButton.style.cursor = 'pointer';
                exportButton.style.backgroundColor = '#756FE9';
                exportButton.style.color = '#fff';
                exportButton.style.border = 'none';
                exportButton.style.width = '65px';
                exportButton.style.padding = '5px 10px';
                exportButton.style.borderRadius = '4px';
                exportButton.className = 'custom-export-button'; // 添加类名以便识别

                // 添加点击事件
                exportButton.addEventListener('click', function () {
                    const containerText = container.innerText;

                    // 发送消息到 C# 后端
                    if (window.chrome && window.chrome.webview) {
                        window.chrome.webview.postMessage({ type: 'exportText', text: containerText });
                    } else {
                        console.error('window.chrome.webview is not available.');
                    }
                });

                // 将按钮插入到最后一个子元素后面
                container.appendChild(exportButton);
            }
        }
    });
}

// 创建上传按钮
function createUploadButton() {
    const uploadButton = document.createElement('span');
    uploadButton.textContent = '📤';
    uploadButton.classList.add('custom-upload-button');
    uploadButton.style.cursor = 'pointer';
    uploadButton.style.color = '#756FE9';
    uploadButton.style.fontWeight = 'bold';
    uploadButton.style.marginRight = '10px';

    uploadButton.addEventListener('click', function () {
        // 发送上传文件请求到 C# 后端
        if (window.chrome && window.chrome.webview) {
            window.chrome.webview.postMessage({
                type: 'uploadWorkbook'
            });
        } else {
            console.error('未找到 C# 后端通信接口！');
        }
    });

    return uploadButton;
}

// 将上传按钮添加到工具栏
function addUploadButtonToToolbar() {
    const toolbar = document.querySelector('.optionBtn--xj4hyzKT');
    if (toolbar && !toolbar.querySelector('.custom-upload-button')) {
        const uploadButton = createUploadButton();
        toolbar.insertBefore(uploadButton, toolbar.firstChild);
    }
}

// 自定义上传函数 - 接收来自C#的文件数据并直接上传
window.directUploadExcelFile = function (fileData, fileName, fileType) {
    try {
        // 查找文件上传控件
        const fileInput = document.querySelector('input[type="file"]');
        if (!fileInput) {
            if (window.chrome && window.chrome.webview) {
                window.chrome.webview.postMessage({
                    type: 'uploadError',
                    message: '未找到文件上传控件'
                });
            }
            return;
        }

        // 创建包含文件数据的Blob对象
        const blob = base64ToBlob(fileData, fileType);

        // 创建包含文件的DataTransfer对象
        const dt = new DataTransfer();
        const file = new File([blob], fileName, { type: fileType });
        dt.items.add(file);

        // 将DataTransfer对象分配给文件输入元素
        fileInput.files = dt.files;

        // 触发change事件
        const event = new Event('change', { bubbles: true });
        fileInput.dispatchEvent(event);

        // 通知上传成功
        if (window.chrome && window.chrome.webview) {
            window.chrome.webview.postMessage({
                type: 'uploadStarted',
                fileName: fileName
            });
        }

        // 对于某些网站可能需要自动提交表单
        const form = fileInput.closest('form');
        if (form) {
            // 可选：延迟提交表单
            setTimeout(() => {
                form.submit();
            }, 500);
        }
    } catch (error) {
        if (window.chrome && window.chrome.webview) {
            window.chrome.webview.postMessage({
                type: 'uploadError',
                message: '上传过程中出错: ' + error.message
            });
        }
    }
};

// Base64字符串转Blob对象
function base64ToBlob(base64, mimeType) {
    // 解码Base64字符串
    const byteCharacters = atob(base64);
    const byteArrays = [];

    for (let offset = 0; offset < byteCharacters.length; offset += 1024) {
        const slice = byteCharacters.slice(offset, offset + 1024);

        const byteNumbers = new Array(slice.length);
        for (let i = 0; i < slice.length; i++) {
            byteNumbers[i] = slice.charCodeAt(i);
        }

        const byteArray = new Uint8Array(byteNumbers);
        byteArrays.push(byteArray);
    }

    return new Blob(byteArrays, { type: mimeType });
}

// 初始化 MutationObserver
function initObserver() {
    const observer = new MutationObserver(function (mutations) {
        mutations.forEach(mutation => {
            if (mutation.type === 'childList') {
                // 如果 DOM 发生变化，重新添加按钮
                addButtons();
                addExportButton();
                addUploadButtonToToolbar();
            }
        });
    });

    // 监听整个文档的变化
    observer.observe(document.body, {
        childList: true,
        subtree: true
    });
}

// 确保在页面加载完成后执行
function initScript() {
    addButtons();
    addExportButton();
    addUploadButtonToToolbar();
    initObserver();
}

// 检查页面是否已经加载完成
if (document.readyState === 'complete' || document.readyState === 'interactive') {
    initScript();
} else {
    document.addEventListener('DOMContentLoaded', initScript);
}